﻿/*************************************
 * Creator:SW-PeiYang
 * DateTime:2023/2/14 10:21:12
 * Description:<Description>
 * CopyRight:中广核研究院有限公司
 * ***********************************/

using Cpjit.SunnyPaine.Toolkit.Net.Sockets.Model;
using System;
using System.Collections.Concurrent;
using System.Net;

namespace Cpjit.SunnyPaine.Toolkit.Net.Sockets.TCP
{
    /// <summary>
    /// 表示TCP服务端。
    /// </summary>
    public interface ITcpServer : ISocket
    {
        /// <summary>
        /// TCP客户端。
        /// </summary>
        ConcurrentDictionary<string, SocketSession> TcpClients { get; }
        /// <summary>
        /// 监听的IP地址。
        /// </summary>
        IPAddress Host { get; }
        /// <summary>
        /// 监听的端口。
        /// </summary>
        int Port { get; }
        /// <summary>
        /// 是否使用客户端心跳监测。
        /// </summary>
        bool IsUseHeartbeat { get; set; }
        /// <summary>
        /// 心跳保活周期。单位：ms。
        /// </summary>
        int KeepAliveInterval { get; set; }
        /// <summary>
        /// 是否启用自动应答。
        /// </summary>
        bool IsAutoReplay { get; set; }
        /// <summary>
        /// 自动应答内容。
        /// </summary>
        string ReplayContent { get; set; }


        /// <summary>
        /// 当收到消息时发生。
        /// </summary>
        event Action<ITcpServer, SessionEventArgs> OnReceived;
        /// <summary>
        /// 当有客户端连接时发生。
        /// </summary>
        event Action<ITcpServer, SessionEventArgs> OnConnected;
        /// <summary>
        /// 当有客户端断开连接时发生。
        /// </summary>
        event Action<ITcpServer, SessionEventArgs> OnDisConnected;
        /// <summary>
        /// 当出现错误时发生。
        /// </summary>
        event Action<ITcpServer, SessionEventArgs, Exception> OnError;


        /// <summary>
        /// 开始监听。
        /// </summary>
        /// <returns></returns>
        bool Start();

        /// <summary>
        /// 停止监听。
        /// </summary>
        void Stop();

        /// <summary>
        /// 发送消息。
        /// </summary>
        /// <param name="message"></param>
        void Send(string message);

        /// <summary>
        /// 发送消息。
        /// </summary>
        /// <param name="clientId">客户端Id。</param>
        /// <param name="message"></param>
        void Send(string clientId, string message);

        /// <summary>
        /// 发送消息。
        /// </summary>
        /// <param name="endPoint">客户端终结点。</param>
        /// <param name="message"></param>
        void Send(EndPoint endPoint, string message);

        /// <summary>
        /// 发送消息。
        /// </summary>
        /// <param name="datas"></param>
        void Send(byte[] datas);

        /// <summary>
        /// 发送消息。
        /// </summary>
        /// <param name="clientId">客户端Id。</param>
        /// <param name="datas"></param>
        void Send(string clientId, byte[] datas);

        /// <summary>
        /// 发送消息。
        /// </summary>
        /// <param name="endPoint">客户端终结点。</param>
        /// <param name="datas"></param>
        void Send(EndPoint endPoint, byte[] datas);

        /// <summary>
        /// 异步发送消息。
        /// </summary>
        /// <param name="message"></param>
        void SendAsync(string message);

        /// <summary>
        /// 异步发送消息。
        /// </summary>
        /// <param name="clientId">客户端Id。</param>
        /// <param name="message"></param>
        void SendAsync(string clientId, string message);

        /// <summary>
        /// 异步发送消息。
        /// </summary>
        /// <param name="endPoint">客户端终结点。</param>
        /// <param name="message"></param>
        void SendAsync(EndPoint endPoint, string message);

        /// <summary>
        /// 异步发送消息。
        /// </summary>
        /// <param name="datas"></param>
        void SendAsync(byte[] datas);

        /// <summary>
        /// 异步发送消息。
        /// </summary>
        /// <param name="clientId">客户端Id。</param>
        /// <param name="datas"></param>
        void SendAsync(string clientId, byte[] datas);

        /// <summary>
        /// 异步发送消息。
        /// </summary>
        /// <param name="endPoint">客户端终结点。</param>
        /// <param name="datas"></param>
        void SendAsync(EndPoint endPoint, byte[] datas);
    }
}
